library(readr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
Analyze dataset from 4/10/24, for the gels made on 4/8/24. There is an n = 3 for each thickness, with 3 gels of 200 um thickness (“thin”) and 3 gels of 1000 um thickness (“thick”). Three profiles were taken per gel, at a light intensity of PAR” 90 umol/m^2/s and a flow rate of 0.5 cm/s. Three additional profiles were taken per gel in the dark after 20 minutes of dark adaptation. The profiles were taken in the middle of the hydrogel, in the same position for all 6 profiles per gel.
files <- list.files(path = "./Polymerized040824_Measured041024", pattern = "\\.csv$", full.names = TRUE)
plot_list <- list()
for (file in files) {
file_name <- tools::file_path_sans_ext(basename(file))
file_data <- read_csv(paste(file),show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`)
plot <- ggplot(data = file_data, aes(y = `Oxygen (µmol/L)`, x = `Depth (µm)`,
color = `Condition`, shape = `Replicate`)) +
geom_point() + geom_line() +
coord_flip() + scale_x_reverse() + ylim(190, 295) +
theme_bw() + ggtitle(file_name) +
annotate("text", x = -1900, y = 295, label = paste("Start:", file_data$Time[1]), vjust = 1, hjust = 1, size = 3) +
annotate("text", x = -1800, y = 295, label = paste("End:", file_data$Time[nrow(file_data)]), vjust = 1, hjust = 1, size = 3) +
theme(legend.position = "bottom")
#print(plot)
plot_list[[file_name]] <- plot
}
## New names:
## New names:
## New names:
## New names:
## New names:
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
arranged_plots <- arrangeGrob(grobs = plot_list, ncol = 3)
gridExtra::grid.arrange(arranged_plots)
ggsave("Plots/Polymerized040824_Measured041024_plots.png", arranged_plots, width = 16, height = 9, units = "in", device = "png")
Wangpraseurt et al 2022: For each profile, the diffusive O2 flux was calculated using Fick’s first law of diffusion as described previously[31] (using a diffusion coefficient of DO2 = 2.2417 × 10−5). The effective DBL thickness δe as the intersection between the extrapolation of the linear part of the O2 slope within the boundary layer that intercepts with the O2 concentration of the bulk medium was calculated.[75]
Wangpraseurt et al 2020: “The diffusive O2 flux was calculated via Fick’s first law of diffusion for a water temperature = 25 °C and salinity = 30 using a molecular diffusion coefficient for O2 = 2.255 × 10−5 cm2 s−1(2). Gross photosynthesis was estimated via the light-dark shift method36. A flow chamber set-up provided slow laminar flow (flow rate = 0.5 cm s−1) and a fiber-optic halogen lamp (Schott KL2500, Schott, Germany) provided white light at defined levels of incident irradiance (400–700 nm) (0, 110, 220, and 1200 µmol photons m−2 s−1)2. Photosynthesis-irradiance curves were fitted to an exponential function37.”
library(segmented)
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
## Loading required package: nlme
##
## Attaching package: 'nlme'
## The following object is masked from 'package:dplyr':
##
## collapse
results_df_1000um_segmented <- data.frame(
File = character(),
Scaffold_Thickness = character(),
Replicate = character(),
slope = numeric(),
Flux = numeric(),
Breakpoint = numeric(),
Oxygen_Surface = numeric(),
Oxygen_breakpoint = numeric(),
stringsAsFactors = FALSE
)
# Function to perform segmented regression and extract slope after breakpoint
perform_segmented_regression <- function(oxygen_concentration, depth) {
# Fit segmented regression model
fit <- segmented(lm(oxygen_concentration ~ depth), seg.Z = ~depth, psi = -250)
# Extract the breakpoint(s)
breakpoint <- fit$psi[, 2]
# Find the index of the datapoint nearest to the breakpoint
breakpoint_index <- which.min(abs(depth - breakpoint))
# Extract the oxygen concentration at the breakpoint
Oxygen_breakpoint <- oxygen_concentration[breakpoint_index]
# Extract the oxygen concentration at depth = 0
Oxygen_Surface <- oxygen_concentration[which(depth == 0)]
# Extract the slope after the breakpoint for each segment
lm_fit <- lm(oxygen_concentration ~ depth,
data = data.frame(depth = depth[breakpoint_index:length(depth)],
oxygen_concentration = oxygen_concentration[breakpoint_index:length(oxygen_concentration)]))
slope <- coef(lm_fit)["depth"]
# Calculate fitted values for segmented regression lines
fitted_values <- fitted(fit, newdata = data.frame(depth = depth))
# Create dataframe with depth and fitted oxygen concentration values
fitted_data <- data.frame("Depth" = depth, "Oxygen" = fitted_values)
return(list(
slope = slope,
breakpoint = breakpoint,
Oxygen_breakpoint = Oxygen_breakpoint,
Oxygen_Surface = Oxygen_Surface,
fitted_data = fitted_data
))
}
# Get list of CSV file names with "1000" in the title
file_list <- list.files(path = "./Polymerized040824_Measured041024", pattern = "1000.*\\.csv$", full.names = TRUE)
# Loop over files
for (file_path in file_list) {
# Read data from file
data <- read_csv(file_path, show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) %>%
arrange(`Depth (µm)`)
# Loop over replicates
for (replicate_id in unique(data$Replicate)) {
# Subset data for the current replicate
replicate_data <- data %>%
filter(Replicate == replicate_id & Condition == "Light")
# Extract oxygen concentration and depth
oxygen_concentration <- replicate_data %>% pull(`Oxygen (µmol/L)`)
depth <- replicate_data %>% pull(`Depth (µm)`)
# Perform segmented regression
regression_results <- perform_segmented_regression(oxygen_concentration, depth)
# Plot data and segmented regression lines
p <- ggplot(replicate_data, aes(x = `Depth (µm)`, y = `Oxygen (µmol/L)`)) +
geom_point() +
geom_line(data = regression_results$fitted_data, aes(x = `Depth`, y = `Oxygen`), color = "red") +
labs(title = paste("Replicate", replicate_id), x = "Depth (µm)", y = "Oxygen (µmol/L)")
print(p)
# Calculate flux using Fick’s first law of diffusion
DO2 <- 2.2417e-5 # Diffusion coefficient of oxygen
flux <- DO2 * regression_results$slope
# Store results in dataframe
results_df_1000um_segmented <- bind_rows(results_df_1000um_segmented, data.frame(
File = basename(file_path),
Scaffold_Thickness = "1000 um",
Replicate = replicate_id,
slope = regression_results$slope,
Flux = flux,
Breakpoint = regression_results$breakpoint,
Oxygen_Surface = regression_results$Oxygen_Surface,
Oxygen_breakpoint = regression_results$Oxygen_breakpoint,
stringsAsFactors = FALSE
))
}
}
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
# Print the results dataframe
print(results_df_1000um_segmented)
## File Scaffold_Thickness Replicate slope
## depth...1 Gel040824_1000um_4.csv 1000 um 1 0.4163000
## depth...2 Gel040824_1000um_4.csv 1000 um 2 0.2972034
## depth...3 Gel040824_1000um_4.csv 1000 um 3 0.3480109
## depth...4 Gel040824_1000um_5.csv 1000 um 1 0.3158300
## depth...5 Gel040824_1000um_5.csv 1000 um 2 0.2252707
## depth...6 Gel040824_1000um_5.csv 1000 um 3 0.3405020
## depth...7 Gel040824_1000um_6.csv 1000 um 1 0.3064920
## depth...8 Gel040824_1000um_6.csv 1000 um 2 0.2625240
## depth...9 Gel040824_1000um_6.csv 1000 um 3 0.2755740
## Flux Breakpoint Oxygen_Surface Oxygen_breakpoint
## depth...1 9.332197e-06 -186.4981 293.493 214.610
## depth...2 6.662409e-06 -228.7611 285.615 212.969
## depth...3 7.801359e-06 -226.2641 292.447 209.878
## depth...4 7.079961e-06 -207.0086 281.456 221.030
## depth...5 5.049894e-06 -276.5534 282.833 215.546
## depth...6 7.633033e-06 -176.8002 283.175 216.541
## depth...7 6.870631e-06 -162.7789 264.643 219.004
## depth...8 5.885001e-06 -178.6104 269.245 217.059
## depth...9 6.177542e-06 -207.1288 272.468 218.221
results_df_200um_segmented <- data.frame(
File = character(),
Scaffold_Thickness = character(),
Replicate = character(),
slope = numeric(),
Flux = numeric(),
Breakpoint = numeric(),
Oxygen_Surface = numeric(),
Oxygen_breakpoint = numeric(),
stringsAsFactors = FALSE
)
# Function to perform segmented regression and extract slope after breakpoint
perform_segmented_regression <- function(oxygen_concentration, depth) {
# Fit segmented regression model
fit <- segmented(lm(oxygen_concentration ~ depth), seg.Z = ~depth, psi = -400)
# Extract the breakpoint(s)
breakpoint <- fit$psi[, 2]
# Find the index of the datapoint nearest to the breakpoint
breakpoint_index <- which.min(abs(depth - breakpoint))
# Extract the oxygen concentration at the breakpoint
Oxygen_breakpoint <- oxygen_concentration[breakpoint_index]
# Extract the oxygen concentration at depth = 0
Oxygen_Surface <- oxygen_concentration[which(depth == 0)]
# Extract the slope after the breakpoint for each segment
lm_fit <- lm(oxygen_concentration ~ depth,
data = data.frame(depth = depth[breakpoint_index:length(depth)],
oxygen_concentration = oxygen_concentration[breakpoint_index:length(oxygen_concentration)]))
slope <- coef(lm_fit)["depth"]
# Calculate fitted values for segmented regression lines
fitted_values <- fitted(fit, newdata = data.frame(depth = depth))
# Create dataframe with depth and fitted oxygen concentration values
fitted_data <- data.frame("Depth" = depth, "Oxygen" = fitted_values)
return(list(
slope = slope,
breakpoint = breakpoint,
Oxygen_breakpoint = Oxygen_breakpoint,
Oxygen_Surface = Oxygen_Surface,
fitted_data = fitted_data
))
}
# Get list of CSV file names with "200" in the title
file_list <- list.files(path = "./Polymerized040824_Measured041024", pattern = "200.*\\.csv$", full.names = TRUE)
# Loop over files
for (file_path in file_list) {
# Read data from file
data <- read_csv(file_path, show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) %>%
arrange(`Depth (µm)`)
# Loop over replicates
for (replicate_id in unique(data$Replicate)) {
# Subset data for the current replicate
replicate_data <- data %>%
filter(Replicate == replicate_id & Condition == "Light")
# Extract oxygen concentration and depth
oxygen_concentration <- replicate_data %>% pull(`Oxygen (µmol/L)`)
depth <- replicate_data %>% pull(`Depth (µm)`)
# Perform segmented regression
regression_results <- perform_segmented_regression(oxygen_concentration, depth)
# Plot data and segmented regression lines
p <- ggplot(replicate_data, aes(x = `Depth (µm)`, y = `Oxygen (µmol/L)`)) +
geom_point() +
geom_line(data = regression_results$fitted_data, aes(x = `Depth`, y = `Oxygen`), color = "red") +
labs(title = paste("Replicate", replicate_id), x = "Depth (µm)", y = "Oxygen (µmol/L)")
print(p)
# Calculate flux using Fick’s first law of diffusion
DO2 <- 2.2417e-5 # Diffusion coefficient of oxygen
flux <- DO2 * regression_results$slope
# Store results in dataframe
results_df_200um_segmented <- bind_rows(results_df_200um_segmented, data.frame(
File = basename(file_path),
Scaffold_Thickness = "200 um",
Replicate = replicate_id,
slope = regression_results$slope,
Flux = flux,
Breakpoint = regression_results$breakpoint,
Oxygen_Surface = regression_results$Oxygen_Surface,
Oxygen_breakpoint = regression_results$Oxygen_breakpoint,
stringsAsFactors = FALSE
))
}
}
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
# Print the results dataframe
print(results_df_200um_segmented)
## File Scaffold_Thickness Replicate slope
## depth...1 Gel040824_200um_4.csv 200 um 1 0.10182714
## depth...2 Gel040824_200um_4.csv 200 um 2 0.12417314
## depth...3 Gel040824_200um_4.csv 200 um 3 0.11439429
## depth...4 Gel040824_200um_5.csv 200 um 1 0.09876400
## depth...5 Gel040824_200um_5.csv 200 um 2 0.09298171
## depth...6 Gel040824_200um_5.csv 200 um 3 0.10329143
## depth...7 Gel040824_200um_6.csv 200 um 1 0.09034171
## depth...8 Gel040824_200um_6.csv 200 um 2 0.06573738
## depth...9 Gel040824_200um_6.csv 200 um 3 0.08116286
## Flux Breakpoint Oxygen_Surface Oxygen_breakpoint
## depth...1 2.282659e-06 -278.3708 235.138 206.914
## depth...2 2.783589e-06 -269.4554 237.367 208.720
## depth...3 2.564377e-06 -269.4545 235.725 208.342
## depth...4 2.213993e-06 -236.2531 230.437 206.340
## depth...5 2.084371e-06 -237.5620 229.684 207.066
## depth...6 2.315484e-06 -266.7288 232.367 207.491
## depth...7 2.025190e-06 -274.4906 231.559 209.808
## depth...8 1.473635e-06 -340.0699 229.721 207.371
## depth...9 1.819428e-06 -310.8676 230.814 207.816
Full_results_segmented_041024 <- rbind(results_df_1000um_segmented, results_df_200um_segmented)
Full_results_segmented_041024
## File Scaffold_Thickness Replicate slope
## depth...1 Gel040824_1000um_4.csv 1000 um 1 0.41630000
## depth...2 Gel040824_1000um_4.csv 1000 um 2 0.29720343
## depth...3 Gel040824_1000um_4.csv 1000 um 3 0.34801086
## depth...4 Gel040824_1000um_5.csv 1000 um 1 0.31583000
## depth...5 Gel040824_1000um_5.csv 1000 um 2 0.22527071
## depth...6 Gel040824_1000um_5.csv 1000 um 3 0.34050200
## depth...7 Gel040824_1000um_6.csv 1000 um 1 0.30649200
## depth...8 Gel040824_1000um_6.csv 1000 um 2 0.26252400
## depth...9 Gel040824_1000um_6.csv 1000 um 3 0.27557400
## depth...11 Gel040824_200um_4.csv 200 um 1 0.10182714
## depth...21 Gel040824_200um_4.csv 200 um 2 0.12417314
## depth...31 Gel040824_200um_4.csv 200 um 3 0.11439429
## depth...41 Gel040824_200um_5.csv 200 um 1 0.09876400
## depth...51 Gel040824_200um_5.csv 200 um 2 0.09298171
## depth...61 Gel040824_200um_5.csv 200 um 3 0.10329143
## depth...71 Gel040824_200um_6.csv 200 um 1 0.09034171
## depth...81 Gel040824_200um_6.csv 200 um 2 0.06573738
## depth...91 Gel040824_200um_6.csv 200 um 3 0.08116286
## Flux Breakpoint Oxygen_Surface Oxygen_breakpoint
## depth...1 9.332197e-06 -186.4981 293.493 214.610
## depth...2 6.662409e-06 -228.7611 285.615 212.969
## depth...3 7.801359e-06 -226.2641 292.447 209.878
## depth...4 7.079961e-06 -207.0086 281.456 221.030
## depth...5 5.049894e-06 -276.5534 282.833 215.546
## depth...6 7.633033e-06 -176.8002 283.175 216.541
## depth...7 6.870631e-06 -162.7789 264.643 219.004
## depth...8 5.885001e-06 -178.6104 269.245 217.059
## depth...9 6.177542e-06 -207.1288 272.468 218.221
## depth...11 2.282659e-06 -278.3708 235.138 206.914
## depth...21 2.783589e-06 -269.4554 237.367 208.720
## depth...31 2.564377e-06 -269.4545 235.725 208.342
## depth...41 2.213993e-06 -236.2531 230.437 206.340
## depth...51 2.084371e-06 -237.5620 229.684 207.066
## depth...61 2.315484e-06 -266.7288 232.367 207.491
## depth...71 2.025190e-06 -274.4906 231.559 209.808
## depth...81 1.473635e-06 -340.0699 229.721 207.371
## depth...91 1.819428e-06 -310.8676 230.814 207.816
mean_flux <- Full_results_segmented_041024 %>%
group_by(Scaffold_Thickness) %>%
summarize(mean_flux = mean(Flux))
# Plotting the flux values for each thickness
flux_plot <- ggplot(Full_results_segmented_041024, aes(x = Scaffold_Thickness, y = Flux)) +
geom_boxplot() + geom_point(aes(color = File), position = position_jitter(width = 0.05)) +
geom_text(data = mean_flux, aes(label = paste("Mean Flux = \n", sprintf("%.2e", mean_flux)), y = mean_flux-.000002), vjust = 0.1, position = position_nudge(x = 0.25)) +
labs(x = "Thickness (µm)", y = "Flux") +
ggtitle("Flux Comparison between Thicknesses,\n same volumetric density (4/10/24)")
flux_plot
ggsave("Plots/Polymerized040824_Measured041024_Flux_plot.png", flux_plot, device = "png")
## Saving 7 x 5 in image
# Running ANOVA
anova_result <- aov(Flux ~ Scaffold_Thickness, data = Full_results_segmented_041024)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 1.024e-10 1.024e-10 121.2 7.1e-09 ***
## Residuals 16 1.352e-11 8.400e-13
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# What about for oxygen surface concentration?
mean_Oxygen_Surface <- Full_results_segmented_041024 %>%
group_by(Scaffold_Thickness) %>%
summarize(mean_Oxygen_Surface = mean(Oxygen_Surface))
# Plotting the surface O2 values for each thickness
ggplot(Full_results_segmented_041024, aes(x = Scaffold_Thickness, y = Oxygen_Surface)) +
geom_boxplot() + geom_point(aes(color = File), position = position_jitter(width = 0.05)) +
geom_text(data = mean_Oxygen_Surface, aes(label = paste("Mean Surface Oxygen = \n", round(mean_Oxygen_Surface, 1)), y = mean_Oxygen_Surface-25), vjust = 0.1, position = position_nudge(x = 0.0)) +
labs(x = "Thickness (µm)", y = "Oxygen Surface Concentration (µmol/L)") +
ggtitle("Oxygen Surface Concentration (µmol/L) Comparison between Thicknesses")
# Running ANOVA
anova_result <- aov(Oxygen_Surface ~ Scaffold_Thickness, data = Full_results_segmented_041024)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 10395 10395 193.7 2.33e-10 ***
## Residuals 16 858 54
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# What about DBL Thickness?
mean_DBL_end <- Full_results_segmented_041024 %>%
group_by(Scaffold_Thickness) %>%
summarize(mean_DBL_end = mean(Breakpoint))
# Plotting the DBL Thickness for each scaffold thickness
ggplot(Full_results_segmented_041024, aes(x = Scaffold_Thickness, y = -Breakpoint)) +
geom_boxplot() + geom_point(aes(color = File), position = position_jitter(width = 0.05)) +
geom_text(data = mean_DBL_end, aes(label = paste("Mean DBL Thickness = \n", round(-mean_DBL_end, 1)), y = -mean_DBL_end-65), vjust = 0.1, position = position_nudge(x = 0.0)) +
labs(x = "Thickness (µm)", y = "DBL Thickness (µm)") +
ggtitle("DBL Thickness (µm) Comparison between Thicknesses")
# Running ANOVA
anova_result <- aov(Breakpoint ~ Scaffold_Thickness, data = Full_results_segmented_041024)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 22250 22250 19.44 0.000439 ***
## Residuals 16 18316 1145
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
files <- list.files(path = "./Polymerized040824_Measured041024", pattern = "\\.csv$", full.names = TRUE)
plot_list <- list()
for (file in files) {
file_name <- tools::file_path_sans_ext(basename(file))
file_data <- read_csv(paste(file),show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`)
# Extract the DBL depth for the current file
dbl_depth <- Full_results_segmented_041024$Breakpoint[gsub("\\.csv$", "", Full_results_segmented_041024$File) == file_name]
plot <- ggplot(data = file_data, aes(y = `Oxygen (µmol/L)`, x = `Depth (µm)`,
color = `Condition`, shape = `Replicate`)) +
geom_point() + geom_line() +
coord_flip() + scale_x_reverse() + ylim(190, 295) + xlim(0, -750) +
theme_bw() + ggtitle(file_name) +
annotate("text", x = -650, y = 295, label = paste("Start:", file_data$Time[1]), vjust = 1, hjust = 1, size = 3) +
annotate("text", x = -550, y = 295, label = paste("End:", file_data$Time[nrow(file_data)]), vjust = 1, hjust = 1, size = 3) +
geom_vline(xintercept = dbl_depth, linetype = "dashed") + # Add DBL depth line
theme(legend.position = "bottom")
#print(plot)
plot_list[[file_name]] <- plot
}
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
arranged_plots <- arrangeGrob(grobs = plot_list, ncol = 3)
## Warning: Removed 144 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 144 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 120 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 120 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 144 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 144 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 144 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 144 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 144 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 144 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 144 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 144 rows containing missing values or values outside the scale range
## (`geom_line()`).
gridExtra::grid.arrange(arranged_plots)
ggsave("Plots/Polymerized040824_Measured041024_plots_DBL.png", arranged_plots, width = 16, height = 9, units = "in", device = "png")
Analyze dataset from 4/12/24, for the gels made on 4/10/24. There is an n = 3 for each thickness, with 3 gels of 200 um thickness (“thin”) and 3 gels of 1000 um thickness (“thick”). Three profiles were taken per gel, at a light intensity of PAR 90 umol/m^2/s and a flow rate of 0.5 cm/s. Three additional profiles were taken per gel in the dark after 20 minutes of dark adaptation. The profiles were taken in the middle of the hydrogel, in the same position for all 6 profiles per gel. For this dataset, I began taking profiles into the depth of the gel, which is shown in “positive” depths.
files <- list.files(path = "./Polymerized041024_Measured041224", pattern = "\\.csv$", full.names = TRUE)
plot_list <- list()
for (file in files) {
file_name <- tools::file_path_sans_ext(basename(file))
file_data <- read_csv(paste(file),show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) %>% filter(Condition == "Light" | Condition == "Dark")
plot <- ggplot(data = file_data, aes(y = `Oxygen (µmol/L)`, x = `Depth (µm)`,
color = `Condition`, shape = `Replicate`)) +
geom_point() + geom_line() +
coord_flip() + scale_x_reverse() + xlim(1000, -1450) + ylim(140, 405) +
geom_vline(xintercept = 0, linetype = 3) +
theme_bw() + ggtitle(file_name) +
annotate("text", x = -1400, y = 395, label = paste("Start:", file_data$Time[1]), vjust = 1, hjust = 1, size = 3) +
annotate("text", x = -1300, y = 395, label = paste("End:", file_data$Time[nrow(file_data)]), vjust = 1, hjust = 1, size = 3) +
theme(legend.position = "bottom")
#print(plot)
plot_list[[file_name]] <- plot
}
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
arranged_plots <- arrangeGrob(grobs = plot_list, ncol = 3)
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_line()`).
gridExtra::grid.arrange(arranged_plots)
ggsave("Plots/Polymerized041024_Measured041224_plots.png", arranged_plots, width = 16, height = 9, units = "in", device = "png")
files <- list.files(path = "./Polymerized041024_Measured041224", pattern = "\\.csv$", full.names = TRUE)
plot_list <- list()
for (file in files) {
file_name <- tools::file_path_sans_ext(basename(file))
file_data <- read_csv(paste(file),show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) %>% filter(Condition == "Light" | Condition == "Dark")
# Determine the x-limits and color for the rectangle based on the file name
if (grepl("1000", file_name)) {
rect_x <- c(0, 1000)
} else {
rect_x <- c(0, 200)
}
plot <- ggplot(data = file_data, aes(y = `Oxygen (µmol/L)`, x = `Depth (µm)`,
color = `Condition`, shape = `Replicate`)) +
geom_rect(aes(xmin = rect_x[1], xmax = rect_x[2], ymin = -Inf, ymax = Inf), fill = "tan", color = "tan", alpha = 0.5) +
geom_point() + geom_line() +
coord_flip() + scale_x_reverse() + xlim(1001, -1450) + ylim(140, 405) +
geom_vline(xintercept = 0, linetype = 3) +
theme_bw() + ggtitle(file_name) +
annotate("text", x = -1400, y = 395, label = paste("Start:", file_data$Time[1]), vjust = 1, hjust = 1, size = 3) +
annotate("text", x = -1300, y = 395, label = paste("End:", file_data$Time[nrow(file_data)]), vjust = 1, hjust = 1, size = 3) +
theme(legend.position = "bottom")
print(plot)
}
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_line()`).
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
Extra profiles taken not plotted above:
files <- c("./Polymerized041024_Measured041224/Gel041024_1000um_1.csv", "./Polymerized041024_Measured041224/Gel041024_200um_3.csv")
plot_list <- list()
for (file in files) {
file_name <- tools::file_path_sans_ext(basename(file))
file_data <- read_csv(paste(file),show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) %>% filter(Condition != "Light" & Condition != "Dark")
plot <- ggplot(data = file_data, aes(y = `Oxygen (µmol/L)`, x = `Depth (µm)`,
color = `Condition`, shape = `Replicate`)) +
geom_point() + geom_line() +
coord_flip() + scale_x_reverse() + xlim(0, -1450) +
geom_vline(xintercept = 0, linetype = 3) +
theme_bw() + ggtitle(file_name) +
annotate("text", x = -1400, y = 295, label = paste("Start:", file_data$Time[1]), vjust = 1, hjust = 1, size = 3) +
annotate("text", x = -1300, y = 295, label = paste("End:", file_data$Time[nrow(file_data)]), vjust = 1, hjust = 1, size = 3) +
theme(legend.position = "bottom")
#print(plot)
plot_list[[file_name]] <- plot
}
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
arranged_plots <- arrangeGrob(grobs = plot_list, ncol = 3)
## Warning: Removed 30 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 30 rows containing missing values or values outside the scale range
## (`geom_line()`).
gridExtra::grid.arrange(arranged_plots)
ggsave("Plots/Polymerized041024_Measured041224_plots_extra.png", arranged_plots, width = 16, height = 9, units = "in", device = "png")
library(segmented)
# Function to perform segmented regression and extract slope after breakpoint
perform_segmented_regression <- function(oxygen_concentration, depth) {
# Fit segmented regression model
fit <- segmented(lm(oxygen_concentration ~ depth), seg.Z = ~depth, psi = -500)
# Extract the breakpoint(s)
breakpoint <- fit$psi[, 2]
# Find the index of the datapoint nearest to the breakpoint
breakpoint_index <- which.min(abs(depth - breakpoint))
# Extract the oxygen concentration at the breakpoint
Oxygen_breakpoint <- oxygen_concentration[breakpoint_index]
# Extract the oxygen concentration at depth = 0
Oxygen_Surface <- oxygen_concentration[which(depth == 0)]
# Extract the slope after the breakpoint for each segment
lm_fit <- lm(oxygen_concentration ~ depth,
data = data.frame(depth = depth[breakpoint_index:length(depth)],
oxygen_concentration = oxygen_concentration[breakpoint_index:length(oxygen_concentration)]))
slope <- coef(lm_fit)["depth"]
# Calculate fitted values for segmented regression lines
fitted_values <- fitted(fit, newdata = data.frame(depth = depth))
# Create dataframe with depth and fitted oxygen concentration values
fitted_data <- data.frame("Depth" = depth, "Oxygen" = fitted_values)
return(list(
slope = slope,
breakpoint = breakpoint,
Oxygen_breakpoint = Oxygen_breakpoint,
Oxygen_Surface = Oxygen_Surface,
fitted_data = fitted_data
))
}
results_df_1000um_segmented <- data.frame(
File = character(),
Scaffold_Thickness = character(),
Replicate = character(),
slope = numeric(),
Flux = numeric(),
Breakpoint = numeric(),
Oxygen_Surface = numeric(),
Oxygen_breakpoint = numeric(),
stringsAsFactors = FALSE
)
# Get list of CSV file names with "1000" in the title
file_list <- list.files(path = "./Polymerized041024_Measured041224", pattern = "1000.*\\.csv$", full.names = TRUE)
# Loop over files
for (file_path in file_list) {
# Read data from file
data <- read_csv(file_path, show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) %>%
arrange(`Depth (µm)`)
# Loop over replicates
for (replicate_id in unique(data$Replicate)) {
# Subset data for the current replicate
replicate_data <- data %>%
filter(Replicate == replicate_id & Condition == "Light") %>%
filter(`Depth (µm)` <= 0)
# Extract oxygen concentration and depth
oxygen_concentration <- replicate_data %>% pull(`Oxygen (µmol/L)`)
depth <- replicate_data %>% pull(`Depth (µm)`)
# Perform segmented regression
regression_results <- perform_segmented_regression(oxygen_concentration, depth)
# Plot data and segmented regression lines
p <- ggplot(replicate_data, aes(x = `Depth (µm)`, y = `Oxygen (µmol/L)`)) +
geom_point() +
geom_line(data = regression_results$fitted_data, aes(x = `Depth`, y = `Oxygen`), color = "red") +
labs(title = paste("Replicate", replicate_id), x = "Depth (µm)", y = "Oxygen (µmol/L)")
print(p)
# Calculate flux using Fick’s first law of diffusion
DO2 <- 2.2417e-5 # Diffusion coefficient of oxygen
flux <- DO2 * regression_results$slope
# Store results in dataframe
results_df_1000um_segmented <- bind_rows(results_df_1000um_segmented, data.frame(
File = basename(file_path),
Scaffold_Thickness = "1000 um",
Replicate = replicate_id,
slope = regression_results$slope,
Flux = flux,
Breakpoint = regression_results$breakpoint,
Oxygen_Surface = regression_results$Oxygen_Surface,
Oxygen_breakpoint = regression_results$Oxygen_breakpoint,
stringsAsFactors = FALSE
))
}
}
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
# Print the results dataframe
print(results_df_1000um_segmented)
## File Scaffold_Thickness Replicate slope
## depth...1 Gel041024_1000um_1.csv 1000 um 1 0.1886047
## depth...2 Gel041024_1000um_1.csv 1000 um 2 0.1865547
## depth...3 Gel041024_1000um_1.csv 1000 um 3 0.1909753
## depth...4 Gel041024_1000um_2.csv 1000 um 1 0.1564983
## depth...5 Gel041024_1000um_2.csv 1000 um 2 0.1645147
## depth...6 Gel041024_1000um_2.csv 1000 um 3 0.1813063
## depth...7 Gel041024_1000um_3.csv 1000 um 1 0.2525014
## depth...8 Gel041024_1000um_3.csv 1000 um 2 0.1921323
## depth...9 Gel041024_1000um_3.csv 1000 um 3 0.1993643
## Flux Breakpoint Oxygen_Surface Oxygen_breakpoint
## depth...1 4.227951e-06 -417.4311 288.860 216.726
## depth...2 4.181996e-06 -418.5536 289.131 216.760
## depth...3 4.281094e-06 -389.4811 288.271 215.303
## depth...4 3.508223e-06 -380.1215 273.166 212.490
## depth...5 3.687925e-06 -387.7747 275.934 212.737
## depth...6 4.064344e-06 -412.8095 280.751 211.682
## depth...7 5.660325e-06 -321.0366 288.669 216.095
## depth...8 4.307031e-06 -385.5178 287.524 212.723
## depth...9 4.469150e-06 -385.2196 291.139 213.216
results_df_200um_segmented <- data.frame(
File = character(),
Scaffold_Thickness = character(),
Replicate = character(),
slope = numeric(),
Flux = numeric(),
Breakpoint = numeric(),
Oxygen_Surface = numeric(),
Oxygen_breakpoint = numeric(),
stringsAsFactors = FALSE
)
# Get list of CSV file names with "200" in the title
file_list <- list.files(path = "./Polymerized041024_Measured041224", pattern = "200.*\\.csv$", full.names = TRUE)
# Loop over files
for (file_path in file_list) {
# Read data from file
data <- read_csv(file_path, show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) %>%
arrange(`Depth (µm)`)
# Loop over replicates
for (replicate_id in unique(data$Replicate)) {
# Subset data for the current replicate
replicate_data <- data %>%
filter(Replicate == replicate_id & Condition == "Light") %>%
filter(`Depth (µm)` <= 0)
# Extract oxygen concentration and depth
oxygen_concentration <- replicate_data %>% pull(`Oxygen (µmol/L)`)
depth <- replicate_data %>% pull(`Depth (µm)`)
# Perform segmented regression
regression_results <- perform_segmented_regression(oxygen_concentration, depth)
# Plot data and segmented regression lines
p <- ggplot(replicate_data, aes(x = `Depth (µm)`, y = `Oxygen (µmol/L)`)) +
geom_point() +
geom_line(data = regression_results$fitted_data, aes(x = `Depth`, y = `Oxygen`), color = "red") +
labs(title = paste("Replicate", replicate_id), x = "Depth (µm)", y = "Oxygen (µmol/L)")
print(p)
# Calculate flux using Fick’s first law of diffusion
DO2 <- 2.2417e-5 # Diffusion coefficient of oxygen
flux <- DO2 * regression_results$slope
# Store results in dataframe
results_df_200um_segmented <- bind_rows(results_df_200um_segmented, data.frame(
File = basename(file_path),
Scaffold_Thickness = "200 um",
Replicate = replicate_id,
slope = regression_results$slope,
Flux = flux,
Breakpoint = regression_results$breakpoint,
Oxygen_Surface = regression_results$Oxygen_Surface,
Oxygen_breakpoint = regression_results$Oxygen_breakpoint,
stringsAsFactors = FALSE
))
}
}
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
# Print the results dataframe
print(results_df_200um_segmented)
## File Scaffold_Thickness Replicate slope
## depth...1 Gel041024_200um_1.csv 200 um 1 0.2021880
## depth...2 Gel041024_200um_1.csv 200 um 2 0.2184340
## depth...3 Gel041024_200um_1.csv 200 um 3 0.2466440
## depth...4 Gel041024_200um_2.csv 200 um 1 0.1583019
## depth...5 Gel041024_200um_2.csv 200 um 2 0.1779883
## depth...6 Gel041024_200um_2.csv 200 um 3 0.1804715
## depth...7 Gel041024_200um_3.csv 200 um 1 0.1273800
## depth...8 Gel041024_200um_3.csv 200 um 2 0.1296086
## depth...9 Gel041024_200um_3.csv 200 um 3 0.1346250
## Flux Breakpoint Oxygen_Surface Oxygen_breakpoint
## depth...1 4.532448e-06 -423.0096 284.485 207.667
## depth...2 4.896635e-06 -386.3812 289.267 205.874
## depth...3 5.529019e-06 -385.2487 294.029 202.154
## depth...4 3.548654e-06 -373.7823 258.055 204.006
## depth...5 3.989964e-06 -420.7698 272.079 203.448
## depth...6 4.045630e-06 -438.4452 279.738 201.503
## depth...7 2.855477e-06 -276.4187 234.767 197.122
## depth...8 2.905435e-06 -277.3252 235.705 198.117
## depth...9 3.017889e-06 -278.9906 236.974 197.286
Full_results_segmented_041224 <- rbind(results_df_1000um_segmented, results_df_200um_segmented)
Full_results_segmented_041224
## File Scaffold_Thickness Replicate slope
## depth...1 Gel041024_1000um_1.csv 1000 um 1 0.1886047
## depth...2 Gel041024_1000um_1.csv 1000 um 2 0.1865547
## depth...3 Gel041024_1000um_1.csv 1000 um 3 0.1909753
## depth...4 Gel041024_1000um_2.csv 1000 um 1 0.1564983
## depth...5 Gel041024_1000um_2.csv 1000 um 2 0.1645147
## depth...6 Gel041024_1000um_2.csv 1000 um 3 0.1813063
## depth...7 Gel041024_1000um_3.csv 1000 um 1 0.2525014
## depth...8 Gel041024_1000um_3.csv 1000 um 2 0.1921323
## depth...9 Gel041024_1000um_3.csv 1000 um 3 0.1993643
## depth...11 Gel041024_200um_1.csv 200 um 1 0.2021880
## depth...21 Gel041024_200um_1.csv 200 um 2 0.2184340
## depth...31 Gel041024_200um_1.csv 200 um 3 0.2466440
## depth...41 Gel041024_200um_2.csv 200 um 1 0.1583019
## depth...51 Gel041024_200um_2.csv 200 um 2 0.1779883
## depth...61 Gel041024_200um_2.csv 200 um 3 0.1804715
## depth...71 Gel041024_200um_3.csv 200 um 1 0.1273800
## depth...81 Gel041024_200um_3.csv 200 um 2 0.1296086
## depth...91 Gel041024_200um_3.csv 200 um 3 0.1346250
## Flux Breakpoint Oxygen_Surface Oxygen_breakpoint
## depth...1 4.227951e-06 -417.4311 288.860 216.726
## depth...2 4.181996e-06 -418.5536 289.131 216.760
## depth...3 4.281094e-06 -389.4811 288.271 215.303
## depth...4 3.508223e-06 -380.1215 273.166 212.490
## depth...5 3.687925e-06 -387.7747 275.934 212.737
## depth...6 4.064344e-06 -412.8095 280.751 211.682
## depth...7 5.660325e-06 -321.0366 288.669 216.095
## depth...8 4.307031e-06 -385.5178 287.524 212.723
## depth...9 4.469150e-06 -385.2196 291.139 213.216
## depth...11 4.532448e-06 -423.0096 284.485 207.667
## depth...21 4.896635e-06 -386.3812 289.267 205.874
## depth...31 5.529019e-06 -385.2487 294.029 202.154
## depth...41 3.548654e-06 -373.7823 258.055 204.006
## depth...51 3.989964e-06 -420.7698 272.079 203.448
## depth...61 4.045630e-06 -438.4452 279.738 201.503
## depth...71 2.855477e-06 -276.4187 234.767 197.122
## depth...81 2.905435e-06 -277.3252 235.705 198.117
## depth...91 3.017889e-06 -278.9906 236.974 197.286
mean_flux <- Full_results_segmented_041224 %>%
group_by(Scaffold_Thickness) %>%
summarize(mean_flux = mean(Flux))
# Plotting the flux values for each thickness
flux_plot <- ggplot(Full_results_segmented_041224, aes(x = Scaffold_Thickness, y = Flux)) +
geom_boxplot() + geom_point(aes(color = File), position = position_jitter(width = 0.05)) +
geom_text(data = mean_flux, aes(label = paste("Mean Flux = \n", sprintf("%.2e", mean_flux)), y = mean_flux-.000002), vjust = 0.1, position = position_nudge(x = 0.25)) +
labs(x = "Thickness (µm)", y = "Flux") +
ggtitle("Flux Comparison between Thicknesses,\n same areal density (4/12/24)")
flux_plot
ggsave("Plots/Polymerized041024_Measured041224_Flux_plot.png", flux_plot, device = "png")
## Saving 7 x 5 in image
# Running ANOVA
anova_result <- aov(Flux ~ Scaffold_Thickness, data = Full_results_segmented_041224)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 5.230e-13 5.225e-13 0.836 0.374
## Residuals 16 9.997e-12 6.248e-13
# What about for oxygen surface concentration?
mean_Oxygen_Surface <- Full_results_segmented_041224 %>%
group_by(Scaffold_Thickness) %>%
summarize(mean_Oxygen_Surface = mean(Oxygen_Surface))
# Plotting the surface O2 values for each thickness
ggplot(Full_results_segmented_041224, aes(x = Scaffold_Thickness, y = Oxygen_Surface)) +
geom_boxplot() + geom_point(aes(color = File), position = position_jitter(width = 0.05)) +
geom_text(data = mean_Oxygen_Surface, aes(label = paste("Mean Surface Oxygen = \n", round(mean_Oxygen_Surface, 1)), y = mean_Oxygen_Surface-25), vjust = 0.1, position = position_nudge(x = 0.0)) +
labs(x = "Thickness (µm)", y = "Oxygen Surface Concentration (µmol/L)") +
ggtitle("Oxygen Surface Concentration (µmol/L) Comparison between Thicknesses")
# Running ANOVA
anova_result <- aov(Oxygen_Surface ~ Scaffold_Thickness, data = Full_results_segmented_041224)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 1767 1767 5.627 0.0306 *
## Residuals 16 5025 314
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# What about DBL Thickness?
mean_DBL_end <- Full_results_segmented_041224 %>%
group_by(Scaffold_Thickness) %>%
summarize(mean_DBL_end = mean(Breakpoint))
# Plotting the DBL Thickness for each scaffold thickness
ggplot(Full_results_segmented_041224, aes(x = Scaffold_Thickness, y = -Breakpoint)) +
geom_boxplot() + geom_point(aes(color = File), position = position_jitter(width = 0.05)) +
geom_text(data = mean_DBL_end, aes(label = paste("Mean DBL Thickness = \n", round(-mean_DBL_end, 1)), y = -mean_DBL_end-65), vjust = 0.1, position = position_nudge(x = 0.0)) +
labs(x = "Thickness (µm)", y = "DBL Thickness (µm)") +
ggtitle("DBL Thickness (µm) Comparison between Thicknesses")
# Running ANOVA
anova_result <- aov(Breakpoint ~ Scaffold_Thickness, data = Full_results_segmented_041224)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 3136 3136 1.176 0.294
## Residuals 16 42651 2666
files <- list.files(path = "./Polymerized041024_Measured041224", pattern = "\\.csv$", full.names = TRUE)
plot_list <- list()
for (file in files) {
file_name <- tools::file_path_sans_ext(basename(file))
file_data <- read_csv(paste(file),show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) %>% filter(Condition == "Light" | Condition == "Dark")
# Extract the DBL depth for the current file
dbl_depth <- Full_results_segmented_041224$Breakpoint[gsub("\\.csv$", "", Full_results_segmented_041224$File) == file_name]
plot <- ggplot(data = file_data, aes(y = `Oxygen (µmol/L)`, x = `Depth (µm)`,
color = `Condition`, shape = `Replicate`)) +
geom_point() + geom_line() +
coord_flip() + scale_x_reverse() + xlim(0, -1000) + ylim(140, 405) +
theme_bw() + ggtitle(file_name) +
annotate("text", x = -900, y = 395, label = paste("Start:", file_data$Time[1]), vjust = 1, hjust = 1, size = 3) +
annotate("text", x = -850, y = 395, label = paste("End:", file_data$Time[nrow(file_data)]), vjust = 1, hjust = 1, size = 3) +
geom_vline(xintercept = dbl_depth, linetype = "dashed") + # Add DBL depth line
theme(legend.position = "bottom")
#print(plot)
plot_list[[file_name]] <- plot
}
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
arranged_plots <- arrangeGrob(grobs = plot_list, ncol = 3)
## Warning: Removed 159 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 159 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 156 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 156 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 156 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 156 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 66 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 66 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 66 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 66 rows containing missing values or values outside the scale range
## (`geom_line()`).
gridExtra::grid.arrange(arranged_plots)
ggsave("Plots/Polymerized041024_Measured041224_plots_DBL.png", arranged_plots, width = 16, height = 9, units = "in", device = "png")
Analyze dataset from 4/13/24, for the gels (numbered 1-3) made on 4/08/24. These gels were stressed out using high light (PAR 630 umol/m^2/s) for two hours from 9AM-11AM in the morning in the incubator they were kept in and then held at ambient light (PAR = 90) until profiles were taken. There is an n = 3 for each thickness, with 3 gels of 200 um thickness (“thin”) and 3 gels of 1000 um thickness (“thick”). Three profiles were taken per gel, at a light intensity of PAR 90 umol/m^2/s and a flow rate of 0.5 cm/s. Three additional profiles were taken per gel in high light (PAR 630 umol/m^2/s) after 5-10 minutes of adaptation to equilibrium based on the oxygen surface concentration no longer increasing and reaching steady state. The profiles were taken in the middle of the hydrogel, in the same position for all 6 profiles per gel. Profiles were taken partially into the depth of the gel, which is shown in “positive” depths.
files <- list.files(path = "./Polymerized040824_Measured041324", pattern = "\\.csv$", full.names = TRUE)
plot_list <- list()
for (file in files) {
file_name <- tools::file_path_sans_ext(basename(file))
file_data <- read_csv(paste(file),show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) #%>% filter(Condition == "Light" | Condition == "Dark")
plot <- ggplot(data = file_data, aes(y = `Oxygen (µmol/L)`, x = `Depth (µm)`,
color = `Condition`, shape = `Replicate`)) +
geom_point() + geom_line() +
coord_flip() + scale_x_reverse() + xlim(1000, -1450) + ylim(200, 900) +
geom_vline(xintercept = 0, linetype = 3) +
theme_bw() + ggtitle(file_name) +
annotate("text", x = -1400, y = 395, label = paste("Start:", file_data$Time[1]), vjust = 1, hjust = 1, size = 3) +
annotate("text", x = -1300, y = 395, label = paste("End:", file_data$Time[nrow(file_data)]), vjust = 1, hjust = 1, size = 3) +
theme(legend.position = "bottom")
#print(plot)
plot_list[[file_name]] <- plot
}
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
arranged_plots <- arrangeGrob(grobs = plot_list, ncol = 3)
gridExtra::grid.arrange(arranged_plots)
ggsave("Plots/Polymerized040824_Measured041324_plots.png", arranged_plots, width = 16, height = 9, units = "in", device = "png")
files <- list.files(path = "./Polymerized040824_Measured041324", pattern = "\\.csv$", full.names = TRUE)
plot_list <- list()
for (file in files) {
file_name <- tools::file_path_sans_ext(basename(file))
file_data <- read_csv(paste(file),show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) #%>% filter(Condition == "Light" | Condition == "Dark")
# Determine the x-limits and color for the rectangle based on the file name
if (grepl("1000", file_name)) {
rect_x <- c(0, 1000)
} else {
rect_x <- c(0, 200)
}
plot <- ggplot(data = file_data, aes(y = `Oxygen (µmol/L)`, x = `Depth (µm)`,
color = `Condition`, shape = `Replicate`)) +
geom_rect(aes(xmin = rect_x[1], xmax = rect_x[2], ymin = -Inf, ymax = Inf), fill = "tan", color = "tan", alpha = 0.5) +
geom_point() + geom_line() +
coord_flip() + scale_x_reverse() + xlim(1001, -1450) + ylim(200, 900) +
geom_vline(xintercept = 0, linetype = 3) +
theme_bw() + ggtitle(file_name) +
annotate("text", x = -1400, y = 395, label = paste("Start:", file_data$Time[1]), vjust = 1, hjust = 1, size = 3) +
annotate("text", x = -1300, y = 395, label = paste("End:", file_data$Time[nrow(file_data)]), vjust = 1, hjust = 1, size = 3) +
theme(legend.position = "bottom")
print(plot)
}
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
library(segmented)
# Function to perform segmented regression and extract slope after breakpoint
perform_segmented_regression <- function(oxygen_concentration, depth) {
# Fit segmented regression model
fit <- segmented(lm(oxygen_concentration ~ depth), seg.Z = ~depth, psi = -250)
# Extract the breakpoint(s)
breakpoint <- fit$psi[, 2]
# Find the index of the datapoint nearest to the breakpoint
breakpoint_index <- which.min(abs(depth - breakpoint))
# Extract the oxygen concentration at the breakpoint
Oxygen_breakpoint <- oxygen_concentration[breakpoint_index]
# Extract the oxygen concentration at depth = 0
Oxygen_Surface <- oxygen_concentration[which(depth == 0)]
# Extract the slope after the breakpoint for each segment
lm_fit <- lm(oxygen_concentration ~ depth,
data = data.frame(depth = depth[breakpoint_index:length(depth)],
oxygen_concentration = oxygen_concentration[breakpoint_index:length(oxygen_concentration)]))
slope <- coef(lm_fit)["depth"]
# Calculate fitted values for segmented regression lines
fitted_values <- fitted(fit, newdata = data.frame(depth = depth))
# Create dataframe with depth and fitted oxygen concentration values
fitted_data <- data.frame("Depth" = depth, "Oxygen" = fitted_values)
return(list(
slope = slope,
breakpoint = breakpoint,
Oxygen_breakpoint = Oxygen_breakpoint,
Oxygen_Surface = Oxygen_Surface,
fitted_data = fitted_data
))
}
results_df_1000um_segmented <- data.frame(
File = character(),
Scaffold_Thickness = character(),
Replicate = character(),
slope = numeric(),
Flux = numeric(),
Breakpoint = numeric(),
Oxygen_Surface = numeric(),
Oxygen_breakpoint = numeric(),
stringsAsFactors = FALSE
)
# Get list of CSV file names with "1000" in the title
file_list <- list.files(path = "./Polymerized040824_Measured041324", pattern = "1000.*\\.csv$", full.names = TRUE)
# Loop over files
for (file_path in file_list) {
# Read data from file
data <- read_csv(file_path, show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) %>%
arrange(`Depth (µm)`)
# Loop over replicates
for (replicate_id in unique(data$Replicate)) {
# Subset data for the current replicate
replicate_data <- data %>%
filter(Replicate == replicate_id & Condition == "Light") %>%
filter(`Depth (µm)` <= 0)
# Extract oxygen concentration and depth
oxygen_concentration <- replicate_data %>% pull(`Oxygen (µmol/L)`)
depth <- replicate_data %>% pull(`Depth (µm)`)
# Perform segmented regression
regression_results <- perform_segmented_regression(oxygen_concentration, depth)
# Plot data and segmented regression lines
p <- ggplot(replicate_data, aes(x = `Depth (µm)`, y = `Oxygen (µmol/L)`)) +
geom_point() +
geom_line(data = regression_results$fitted_data, aes(x = `Depth`, y = `Oxygen`), color = "red") +
labs(title = paste("Replicate", replicate_id), x = "Depth (µm)", y = "Oxygen (µmol/L)")
print(p)
# Calculate flux using Fick’s first law of diffusion
DO2 <- 2.2417e-5 # Diffusion coefficient of oxygen
flux <- DO2 * regression_results$slope
# Store results in dataframe
results_df_1000um_segmented <- bind_rows(results_df_1000um_segmented, data.frame(
File = basename(file_path),
Scaffold_Thickness = "1000 um",
Replicate = replicate_id,
slope = regression_results$slope,
Flux = flux,
Breakpoint = regression_results$breakpoint,
Oxygen_Surface = regression_results$Oxygen_Surface,
Oxygen_breakpoint = regression_results$Oxygen_breakpoint,
stringsAsFactors = FALSE
))
}
}
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
# Print the results dataframe
print(results_df_1000um_segmented)
## File Scaffold_Thickness Replicate slope
## depth...1 Gel040824_1000um_1.csv 1000 um 1 0.5821080
## depth...2 Gel040824_1000um_1.csv 1000 um 2 0.5695080
## depth...3 Gel040824_1000um_1.csv 1000 um 3 0.5511640
## depth...4 Gel040824_1000um_2.csv 1000 um 1 0.5025440
## depth...5 Gel040824_1000um_2.csv 1000 um 2 0.4722500
## depth...6 Gel040824_1000um_2.csv 1000 um 3 0.4822000
## depth...7 Gel040824_1000um_3.csv 1000 um 1 0.3841909
## depth...8 Gel040824_1000um_3.csv 1000 um 2 0.4481669
## depth...9 Gel040824_1000um_3.csv 1000 um 3 0.4936017
## Flux Breakpoint Oxygen_Surface Oxygen_breakpoint
## depth...1 1.304912e-05 -222.7569 350.297 235.901
## depth...2 1.276666e-05 -214.8453 342.694 230.712
## depth...3 1.235544e-05 -239.9065 360.905 227.053
## depth...4 1.126553e-05 -223.8684 327.998 231.279
## depth...5 1.058643e-05 -217.2484 317.507 225.020
## depth...6 1.080948e-05 -214.3318 318.232 223.906
## depth...7 8.612406e-06 -234.9614 312.305 218.707
## depth...8 1.004656e-05 -231.9015 328.562 218.860
## depth...9 1.106507e-05 -229.3515 341.538 220.488
results_df_200um_segmented <- data.frame(
File = character(),
Scaffold_Thickness = character(),
Replicate = character(),
slope = numeric(),
Flux = numeric(),
Breakpoint = numeric(),
Oxygen_Surface = numeric(),
Oxygen_breakpoint = numeric(),
stringsAsFactors = FALSE
)
# Get list of CSV file names with "200" in the title
file_list <- list.files(path = "./Polymerized040824_Measured041324", pattern = "200.*\\.csv$", full.names = TRUE)
# Loop over files
for (file_path in file_list) {
# Read data from file
data <- read_csv(file_path, show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) %>%
arrange(`Depth (µm)`)
# Loop over replicates
for (replicate_id in unique(data$Replicate)) {
# Subset data for the current replicate
replicate_data <- data %>%
filter(Replicate == replicate_id & Condition == "Light") %>%
filter(`Depth (µm)` <= 0)
# Extract oxygen concentration and depth
oxygen_concentration <- replicate_data %>% pull(`Oxygen (µmol/L)`)
depth <- replicate_data %>% pull(`Depth (µm)`)
# Perform segmented regression
regression_results <- perform_segmented_regression(oxygen_concentration, depth)
# Plot data and segmented regression lines
p <- ggplot(replicate_data, aes(x = `Depth (µm)`, y = `Oxygen (µmol/L)`)) +
geom_point() +
geom_line(data = regression_results$fitted_data, aes(x = `Depth`, y = `Oxygen`), color = "red") +
labs(title = paste("Replicate", replicate_id), x = "Depth (µm)", y = "Oxygen (µmol/L)")
print(p)
# Calculate flux using Fick’s first law of diffusion
DO2 <- 2.2417e-5 # Diffusion coefficient of oxygen
flux <- DO2 * regression_results$slope
# Store results in dataframe
results_df_200um_segmented <- bind_rows(results_df_200um_segmented, data.frame(
File = basename(file_path),
Scaffold_Thickness = "200 um",
Replicate = replicate_id,
slope = regression_results$slope,
Flux = flux,
Breakpoint = regression_results$breakpoint,
Oxygen_Surface = regression_results$Oxygen_Surface,
Oxygen_breakpoint = regression_results$Oxygen_breakpoint,
stringsAsFactors = FALSE
))
}
}
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
## New names:
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
# Print the results dataframe
print(results_df_200um_segmented)
## File Scaffold_Thickness Replicate slope
## depth...1 Gel040824_200um_1.csv 200 um 1 0.2072080
## depth...2 Gel040824_200um_1.csv 200 um 2 0.2168434
## depth...3 Gel040824_200um_1.csv 200 um 3 0.2427029
## depth...4 Gel040824_200um_2.csv 200 um 1 0.2040657
## depth...5 Gel040824_200um_2.csv 200 um 2 0.2093743
## depth...6 Gel040824_200um_2.csv 200 um 3 0.2081051
## depth...7 Gel040824_200um_3.csv 200 um 1 0.2263164
## depth...8 Gel040824_200um_3.csv 200 um 2 0.2147954
## depth...9 Gel040824_200um_3.csv 200 um 3 0.2215040
## Flux Breakpoint Oxygen_Surface Oxygen_breakpoint
## depth...1 4.644982e-06 -232.9567 265.988 215.260
## depth...2 4.860979e-06 -229.2693 267.437 214.600
## depth...3 5.440670e-06 -267.6632 276.688 217.204
## depth...4 4.574541e-06 -271.7906 265.946 215.835
## depth...5 4.693543e-06 -268.1471 266.835 215.400
## depth...6 4.665093e-06 -262.7707 264.796 213.796
## depth...7 5.073335e-06 -319.0819 282.498 216.533
## depth...8 4.815069e-06 -236.1913 265.580 213.431
## depth...9 4.965455e-06 -224.9881 260.208 216.236
Full_results_segmented_041324 <- rbind(results_df_1000um_segmented, results_df_200um_segmented)
Full_results_segmented_041324
## File Scaffold_Thickness Replicate slope
## depth...1 Gel040824_1000um_1.csv 1000 um 1 0.5821080
## depth...2 Gel040824_1000um_1.csv 1000 um 2 0.5695080
## depth...3 Gel040824_1000um_1.csv 1000 um 3 0.5511640
## depth...4 Gel040824_1000um_2.csv 1000 um 1 0.5025440
## depth...5 Gel040824_1000um_2.csv 1000 um 2 0.4722500
## depth...6 Gel040824_1000um_2.csv 1000 um 3 0.4822000
## depth...7 Gel040824_1000um_3.csv 1000 um 1 0.3841909
## depth...8 Gel040824_1000um_3.csv 1000 um 2 0.4481669
## depth...9 Gel040824_1000um_3.csv 1000 um 3 0.4936017
## depth...11 Gel040824_200um_1.csv 200 um 1 0.2072080
## depth...21 Gel040824_200um_1.csv 200 um 2 0.2168434
## depth...31 Gel040824_200um_1.csv 200 um 3 0.2427029
## depth...41 Gel040824_200um_2.csv 200 um 1 0.2040657
## depth...51 Gel040824_200um_2.csv 200 um 2 0.2093743
## depth...61 Gel040824_200um_2.csv 200 um 3 0.2081051
## depth...71 Gel040824_200um_3.csv 200 um 1 0.2263164
## depth...81 Gel040824_200um_3.csv 200 um 2 0.2147954
## depth...91 Gel040824_200um_3.csv 200 um 3 0.2215040
## Flux Breakpoint Oxygen_Surface Oxygen_breakpoint
## depth...1 1.304912e-05 -222.7569 350.297 235.901
## depth...2 1.276666e-05 -214.8453 342.694 230.712
## depth...3 1.235544e-05 -239.9065 360.905 227.053
## depth...4 1.126553e-05 -223.8684 327.998 231.279
## depth...5 1.058643e-05 -217.2484 317.507 225.020
## depth...6 1.080948e-05 -214.3318 318.232 223.906
## depth...7 8.612406e-06 -234.9614 312.305 218.707
## depth...8 1.004656e-05 -231.9015 328.562 218.860
## depth...9 1.106507e-05 -229.3515 341.538 220.488
## depth...11 4.644982e-06 -232.9567 265.988 215.260
## depth...21 4.860979e-06 -229.2693 267.437 214.600
## depth...31 5.440670e-06 -267.6632 276.688 217.204
## depth...41 4.574541e-06 -271.7906 265.946 215.835
## depth...51 4.693543e-06 -268.1471 266.835 215.400
## depth...61 4.665093e-06 -262.7707 264.796 213.796
## depth...71 5.073335e-06 -319.0819 282.498 216.533
## depth...81 4.815069e-06 -236.1913 265.580 213.431
## depth...91 4.965455e-06 -224.9881 260.208 216.236
mean_flux <- Full_results_segmented_041324 %>%
group_by(Scaffold_Thickness) %>%
summarize(mean_flux = mean(Flux))
# Plotting the flux values for each thickness
flux_plot <- ggplot(Full_results_segmented_041324, aes(x = Scaffold_Thickness, y = Flux)) +
geom_boxplot() + geom_point(aes(color = File,shape = Replicate), position = position_jitter(width = 0.05)) +
geom_text(data = mean_flux, aes(label = paste("Mean Flux = \n", sprintf("%.2e", mean_flux)), y = mean_flux-.000002), vjust = 0.1, position = position_nudge(x = 0.25)) +
labs(x = "Thickness (µm)", y = "Flux") +
ggtitle("Flux Comparison between Thicknesses,\n same volumetric density (4/13/24)")
flux_plot
ggsave("Plots/Polymerized040824_Measured041324_Flux_plot.png", flux_plot, device = "png")
## Saving 7 x 5 in image
# Running ANOVA
anova_result <- aov(Flux ~ Scaffold_Thickness, data = Full_results_segmented_041324)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 1.794e-10 1.794e-10 175.3 4.88e-10 ***
## Residuals 16 1.637e-11 1.020e-12
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# What about for oxygen surface concentration?
mean_Oxygen_Surface <- Full_results_segmented_041324 %>%
group_by(Scaffold_Thickness) %>%
summarize(mean_Oxygen_Surface = mean(Oxygen_Surface))
# Plotting the surface O2 values for each thickness
ggplot(Full_results_segmented_041324, aes(x = Scaffold_Thickness, y = Oxygen_Surface)) +
geom_boxplot() + geom_point(aes(color = File), position = position_jitter(width = 0.05)) +
geom_text(data = mean_Oxygen_Surface, aes(label = paste("Mean Surface Oxygen = \n", round(mean_Oxygen_Surface, 1)), y = mean_Oxygen_Surface-25), vjust = 0.1, position = position_nudge(x = 0.0)) +
labs(x = "Thickness (µm)", y = "Oxygen Surface Concentration (µmol/L)") +
ggtitle("Oxygen Surface Concentration (µmol/L) Comparison between Thicknesses")
# Running ANOVA
anova_result <- aov(Oxygen_Surface ~ Scaffold_Thickness, data = Full_results_segmented_041324)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 18952 18952 119.1 8.03e-09 ***
## Residuals 16 2546 159
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# What about DBL Thickness?
mean_DBL_end <- Full_results_segmented_041324 %>%
group_by(Scaffold_Thickness) %>%
summarize(mean_DBL_end = mean(Breakpoint))
# Plotting the DBL Thickness for each scaffold thickness
ggplot(Full_results_segmented_041324, aes(x = Scaffold_Thickness, y = -Breakpoint)) +
geom_boxplot() + geom_point(aes(color = File), position = position_jitter(width = 0.05)) +
geom_text(data = mean_DBL_end, aes(label = paste("Mean DBL Thickness = \n", round(-mean_DBL_end, 1)), y = -mean_DBL_end-65), vjust = 0.1, position = position_nudge(x = 0.0)) +
labs(x = "Thickness (µm)", y = "DBL Thickness (µm)") +
ggtitle("DBL Thickness (µm) Comparison between Thicknesses")
# Running ANOVA
anova_result <- aov(Breakpoint ~ Scaffold_Thickness, data = Full_results_segmented_041324)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 4471 4471 9.15 0.00805 **
## Residuals 16 7818 489
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
files <- list.files(path = "./Polymerized040824_Measured041324", pattern = "\\.csv$", full.names = TRUE)
plot_list <- list()
for (file in files) {
file_name <- tools::file_path_sans_ext(basename(file))
file_data <- read_csv(paste(file),show_col_types = FALSE) %>%
mutate(Replicate = as.factor(Replicate)) %>%
rename("Oxygen (µmol/L)" = `A FireSting Ch1 (µmol/L)`) %>% filter(Condition == "Light" | Condition == "Dark")
# Extract the DBL depth for the current file
dbl_depth <- Full_results_segmented_041324$Breakpoint[gsub("\\.csv$", "", Full_results_segmented_041324$File) == file_name]
plot <- ggplot(data = file_data, aes(y = `Oxygen (µmol/L)`, x = `Depth (µm)`,
color = `Condition`, shape = `Replicate`)) +
geom_point() + geom_line() +
coord_flip() + scale_x_reverse() + xlim(0, -1000) + ylim(200, 400) +
theme_bw() + ggtitle(file_name) +
annotate("text", x = -900, y = 395, label = paste("Start:", file_data$Time[1]), vjust = 1, hjust = 1, size = 3) +
annotate("text", x = -850, y = 395, label = paste("End:", file_data$Time[nrow(file_data)]), vjust = 1, hjust = 1, size = 3) +
geom_vline(xintercept = dbl_depth, linetype = "dashed") + # Add DBL depth line
theme(legend.position = "bottom")
#print(plot)
plot_list[[file_name]] <- plot
}
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## New names:
## Scale for x is already present. Adding another scale for x, which will replace
## the existing scale.
## • `B No sensor` -> `B No sensor...7`
## • `B No sensor` -> `B No sensor...9`
arranged_plots <- arrangeGrob(grobs = plot_list, ncol = 3)
## Warning: Removed 72 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 72 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 72 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 72 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 72 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 72 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 33 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 33 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 33 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 33 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 33 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 33 rows containing missing values or values outside the scale range
## (`geom_line()`).
gridExtra::grid.arrange(arranged_plots)
ggsave("Plots/Polymerized040824_Measured041324_plots_DBL.png", arranged_plots, width = 16, height = 9, units = "in", device = "png")
# Add a column indicating the date for each dataframe
Full_results_segmented_041024$date <- "041024"
Full_results_segmented_041024$polymerization_date <- "040824"
Full_results_segmented_041224$date <- "041224"
Full_results_segmented_041224$polymerization_date <- "041024"
Full_results_segmented_041324$date <- "041324"
Full_results_segmented_041324$polymerization_date <- "040824"
# Combine the dataframes
Full_results_segmented <- rbind(Full_results_segmented_041024,
Full_results_segmented_041224,
Full_results_segmented_041324)
Full_results_segmented
## File Scaffold_Thickness Replicate slope
## depth...1 Gel040824_1000um_4.csv 1000 um 1 0.41630000
## depth...2 Gel040824_1000um_4.csv 1000 um 2 0.29720343
## depth...3 Gel040824_1000um_4.csv 1000 um 3 0.34801086
## depth...4 Gel040824_1000um_5.csv 1000 um 1 0.31583000
## depth...5 Gel040824_1000um_5.csv 1000 um 2 0.22527071
## depth...6 Gel040824_1000um_5.csv 1000 um 3 0.34050200
## depth...7 Gel040824_1000um_6.csv 1000 um 1 0.30649200
## depth...8 Gel040824_1000um_6.csv 1000 um 2 0.26252400
## depth...9 Gel040824_1000um_6.csv 1000 um 3 0.27557400
## depth...11 Gel040824_200um_4.csv 200 um 1 0.10182714
## depth...21 Gel040824_200um_4.csv 200 um 2 0.12417314
## depth...31 Gel040824_200um_4.csv 200 um 3 0.11439429
## depth...41 Gel040824_200um_5.csv 200 um 1 0.09876400
## depth...51 Gel040824_200um_5.csv 200 um 2 0.09298171
## depth...61 Gel040824_200um_5.csv 200 um 3 0.10329143
## depth...71 Gel040824_200um_6.csv 200 um 1 0.09034171
## depth...81 Gel040824_200um_6.csv 200 um 2 0.06573738
## depth...91 Gel040824_200um_6.csv 200 um 3 0.08116286
## depth...12 Gel041024_1000um_1.csv 1000 um 1 0.18860467
## depth...22 Gel041024_1000um_1.csv 1000 um 2 0.18655467
## depth...32 Gel041024_1000um_1.csv 1000 um 3 0.19097533
## depth...42 Gel041024_1000um_2.csv 1000 um 1 0.15649833
## depth...52 Gel041024_1000um_2.csv 1000 um 2 0.16451467
## depth...62 Gel041024_1000um_2.csv 1000 um 3 0.18130633
## depth...72 Gel041024_1000um_3.csv 1000 um 1 0.25250143
## depth...82 Gel041024_1000um_3.csv 1000 um 2 0.19213233
## depth...92 Gel041024_1000um_3.csv 1000 um 3 0.19936433
## depth...111 Gel041024_200um_1.csv 200 um 1 0.20218800
## depth...211 Gel041024_200um_1.csv 200 um 2 0.21843400
## depth...311 Gel041024_200um_1.csv 200 um 3 0.24664400
## depth...411 Gel041024_200um_2.csv 200 um 1 0.15830190
## depth...511 Gel041024_200um_2.csv 200 um 2 0.17798833
## depth...611 Gel041024_200um_2.csv 200 um 3 0.18047152
## depth...711 Gel041024_200um_3.csv 200 um 1 0.12738000
## depth...811 Gel041024_200um_3.csv 200 um 2 0.12960857
## depth...911 Gel041024_200um_3.csv 200 um 3 0.13462500
## depth...13 Gel040824_1000um_1.csv 1000 um 1 0.58210800
## depth...23 Gel040824_1000um_1.csv 1000 um 2 0.56950800
## depth...33 Gel040824_1000um_1.csv 1000 um 3 0.55116400
## depth...43 Gel040824_1000um_2.csv 1000 um 1 0.50254400
## depth...53 Gel040824_1000um_2.csv 1000 um 2 0.47225000
## depth...63 Gel040824_1000um_2.csv 1000 um 3 0.48220000
## depth...73 Gel040824_1000um_3.csv 1000 um 1 0.38419086
## depth...83 Gel040824_1000um_3.csv 1000 um 2 0.44816686
## depth...93 Gel040824_1000um_3.csv 1000 um 3 0.49360171
## depth...112 Gel040824_200um_1.csv 200 um 1 0.20720800
## depth...212 Gel040824_200um_1.csv 200 um 2 0.21684343
## depth...312 Gel040824_200um_1.csv 200 um 3 0.24270286
## depth...412 Gel040824_200um_2.csv 200 um 1 0.20406571
## depth...512 Gel040824_200um_2.csv 200 um 2 0.20937429
## depth...612 Gel040824_200um_2.csv 200 um 3 0.20810514
## depth...712 Gel040824_200um_3.csv 200 um 1 0.22631643
## depth...812 Gel040824_200um_3.csv 200 um 2 0.21479543
## depth...912 Gel040824_200um_3.csv 200 um 3 0.22150400
## Flux Breakpoint Oxygen_Surface Oxygen_breakpoint date
## depth...1 9.332197e-06 -186.4981 293.493 214.610 041024
## depth...2 6.662409e-06 -228.7611 285.615 212.969 041024
## depth...3 7.801359e-06 -226.2641 292.447 209.878 041024
## depth...4 7.079961e-06 -207.0086 281.456 221.030 041024
## depth...5 5.049894e-06 -276.5534 282.833 215.546 041024
## depth...6 7.633033e-06 -176.8002 283.175 216.541 041024
## depth...7 6.870631e-06 -162.7789 264.643 219.004 041024
## depth...8 5.885001e-06 -178.6104 269.245 217.059 041024
## depth...9 6.177542e-06 -207.1288 272.468 218.221 041024
## depth...11 2.282659e-06 -278.3708 235.138 206.914 041024
## depth...21 2.783589e-06 -269.4554 237.367 208.720 041024
## depth...31 2.564377e-06 -269.4545 235.725 208.342 041024
## depth...41 2.213993e-06 -236.2531 230.437 206.340 041024
## depth...51 2.084371e-06 -237.5620 229.684 207.066 041024
## depth...61 2.315484e-06 -266.7288 232.367 207.491 041024
## depth...71 2.025190e-06 -274.4906 231.559 209.808 041024
## depth...81 1.473635e-06 -340.0699 229.721 207.371 041024
## depth...91 1.819428e-06 -310.8676 230.814 207.816 041024
## depth...12 4.227951e-06 -417.4311 288.860 216.726 041224
## depth...22 4.181996e-06 -418.5536 289.131 216.760 041224
## depth...32 4.281094e-06 -389.4811 288.271 215.303 041224
## depth...42 3.508223e-06 -380.1215 273.166 212.490 041224
## depth...52 3.687925e-06 -387.7747 275.934 212.737 041224
## depth...62 4.064344e-06 -412.8095 280.751 211.682 041224
## depth...72 5.660325e-06 -321.0366 288.669 216.095 041224
## depth...82 4.307031e-06 -385.5178 287.524 212.723 041224
## depth...92 4.469150e-06 -385.2196 291.139 213.216 041224
## depth...111 4.532448e-06 -423.0096 284.485 207.667 041224
## depth...211 4.896635e-06 -386.3812 289.267 205.874 041224
## depth...311 5.529019e-06 -385.2487 294.029 202.154 041224
## depth...411 3.548654e-06 -373.7823 258.055 204.006 041224
## depth...511 3.989964e-06 -420.7698 272.079 203.448 041224
## depth...611 4.045630e-06 -438.4452 279.738 201.503 041224
## depth...711 2.855477e-06 -276.4187 234.767 197.122 041224
## depth...811 2.905435e-06 -277.3252 235.705 198.117 041224
## depth...911 3.017889e-06 -278.9906 236.974 197.286 041224
## depth...13 1.304912e-05 -222.7569 350.297 235.901 041324
## depth...23 1.276666e-05 -214.8453 342.694 230.712 041324
## depth...33 1.235544e-05 -239.9065 360.905 227.053 041324
## depth...43 1.126553e-05 -223.8684 327.998 231.279 041324
## depth...53 1.058643e-05 -217.2484 317.507 225.020 041324
## depth...63 1.080948e-05 -214.3318 318.232 223.906 041324
## depth...73 8.612406e-06 -234.9614 312.305 218.707 041324
## depth...83 1.004656e-05 -231.9015 328.562 218.860 041324
## depth...93 1.106507e-05 -229.3515 341.538 220.488 041324
## depth...112 4.644982e-06 -232.9567 265.988 215.260 041324
## depth...212 4.860979e-06 -229.2693 267.437 214.600 041324
## depth...312 5.440670e-06 -267.6632 276.688 217.204 041324
## depth...412 4.574541e-06 -271.7906 265.946 215.835 041324
## depth...512 4.693543e-06 -268.1471 266.835 215.400 041324
## depth...612 4.665093e-06 -262.7707 264.796 213.796 041324
## depth...712 5.073335e-06 -319.0819 282.498 216.533 041324
## depth...812 4.815069e-06 -236.1913 265.580 213.431 041324
## depth...912 4.965455e-06 -224.9881 260.208 216.236 041324
## polymerization_date
## depth...1 040824
## depth...2 040824
## depth...3 040824
## depth...4 040824
## depth...5 040824
## depth...6 040824
## depth...7 040824
## depth...8 040824
## depth...9 040824
## depth...11 040824
## depth...21 040824
## depth...31 040824
## depth...41 040824
## depth...51 040824
## depth...61 040824
## depth...71 040824
## depth...81 040824
## depth...91 040824
## depth...12 041024
## depth...22 041024
## depth...32 041024
## depth...42 041024
## depth...52 041024
## depth...62 041024
## depth...72 041024
## depth...82 041024
## depth...92 041024
## depth...111 041024
## depth...211 041024
## depth...311 041024
## depth...411 041024
## depth...511 041024
## depth...611 041024
## depth...711 041024
## depth...811 041024
## depth...911 041024
## depth...13 040824
## depth...23 040824
## depth...33 040824
## depth...43 040824
## depth...53 040824
## depth...63 040824
## depth...73 040824
## depth...83 040824
## depth...93 040824
## depth...112 040824
## depth...212 040824
## depth...312 040824
## depth...412 040824
## depth...512 040824
## depth...612 040824
## depth...712 040824
## depth...812 040824
## depth...912 040824
mean_flux <- Full_results_segmented %>%
group_by(Scaffold_Thickness, date) %>%
summarize(mean_flux = mean(Flux))
## `summarise()` has grouped output by 'Scaffold_Thickness'. You can override
## using the `.groups` argument.
# Plotting the flux values for each thickness
flux_plot <- ggplot(Full_results_segmented, aes(x = date, y = Flux, group = interaction(Scaffold_Thickness, date), color = Scaffold_Thickness)) +
geom_boxplot() + geom_point(position = position_dodge(width = 0.75)) +
#geom_text(data = mean_flux, aes(label = paste("Mean Flux = \n", sprintf("%.2e", mean_flux)), y = mean_flux-.000002), vjust = 0.1, position = position_nudge(x = 0.25)) +
labs(x = "Measurement Date", y = "Flux") +
ggtitle("Flux Comparison between Thicknesses and Dates")
flux_plot
ggsave("Plots/Flux_plot.png", flux_plot, device = "png")
## Saving 7 x 5 in image
# Running ANOVA
anova_result <- aov(Flux ~ Scaffold_Thickness, data = Full_results_segmented)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 1.958e-10 1.958e-10 34.9 2.69e-07 ***
## Residuals 52 2.917e-10 5.610e-12
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# What about for oxygen surface concentration?
mean_Oxygen_Surface <- Full_results_segmented %>%
group_by(Scaffold_Thickness, date) %>%
summarize(mean_Oxygen_Surface = mean(Oxygen_Surface))
## `summarise()` has grouped output by 'Scaffold_Thickness'. You can override
## using the `.groups` argument.
# Plotting the surface O2 values for each thickness
O2_plot <- ggplot(Full_results_segmented, aes(x = date, y = Oxygen_Surface, group = interaction(Scaffold_Thickness, date), color = Scaffold_Thickness)) +
geom_boxplot() + geom_point(position = position_dodge(width = 0.75)) +
#geom_text(data = mean_Oxygen_Surface, aes(label = paste("Mean Surface Oxygen = \n", round(mean_Oxygen_Surface, 1)), y = mean_Oxygen_Surface-25), vjust = 0.1, position = position_nudge(x = 0.0)) +
labs(x = "Measurement Date", y = "Oxygen Surface Concentration (µmol/L)") +
ggtitle("Oxygen Surface Concentration (µmol/L) Comparison between Thicknesses and Dates")
O2_plot
ggsave("Plots/O2_plot.png", O2_plot, device = "png")
## Saving 7 x 5 in image
# Running ANOVA
anova_result <- aov(Oxygen_Surface ~ Scaffold_Thickness, data = Full_results_segmented)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 26444 26444 44.42 1.69e-08 ***
## Residuals 52 30954 595
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# What about DBL Thickness?
mean_DBL_end <- Full_results_segmented %>%
group_by(Scaffold_Thickness, date) %>%
summarize(mean_DBL_end = mean(Breakpoint))
## `summarise()` has grouped output by 'Scaffold_Thickness'. You can override
## using the `.groups` argument.
# Plotting the DBL Thickness for each scaffold thickness
DBL_plot <- ggplot(Full_results_segmented, aes(x = date, y = -Breakpoint, group = interaction(Scaffold_Thickness, date), color = Scaffold_Thickness)) +
geom_boxplot() + geom_point(position = position_dodge(width = 0.75)) +
#geom_text(data = mean_DBL_end, aes(label = paste("Mean DBL Thickness = \n", round(-mean_DBL_end, 1)), y = -mean_DBL_end-65), vjust = 0.1, position = position_nudge(x = 0.0)) +
labs(x = "Measurement Date)", y = "DBL Thickness (µm)") +
ggtitle("DBL Thickness (µm) Comparison between Thicknesses and Dates")
DBL_plot
ggsave("Plots/DBL_plot.png", DBL_plot, device = "png")
## Saving 7 x 5 in image
# Running ANOVA
anova_result <- aov(Breakpoint ~ Scaffold_Thickness, data = Full_results_segmented)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## Scaffold_Thickness 1 8537 8537 1.446 0.235
## Residuals 52 307096 5906